1.linux文件权限一共10位长度
第一段指文件类型
第二段指拥有者所具有的权限
第三段指所属组的成员对于这个文件具有的权限
第四段指其他人对于这个文件有没有任何权限
2.shell是一种命令解释程序
3.>将标准输出信息写入一个新文件(重定向),>>将标准输出信息添加到一个已存在的文件中
4.ctrl+alt+F1:图形界面切换到文字终端界面
5.whereis -b [filename]:查找系统中指定文件名的二进制文件
6.free显示系统中已用资源和空闲资源,m参数以mb为单位显示系统中的资源,t显示系统中的资源并最后进行统计
7.关闭linux的命令:
halt:立刻关机
shutdown -h now:立刻关机(root)
poweroff:立刻关机
8.less显示文件内容时可以上下滚动而more不可以
9./proc/cpuinfo获得CPU的相关信息
10.grub可以引导windows操作系统.grub是引导装入器,负责装入内核并引导Linux系统,也可以引导其他操作系统.如果引导器不能很好的工作或者不具有弹性,那么很可...
Description
题目描述:忘了
附件内容:
from Crypto.Util.number import *
from random import *
from libnum import *
import gmpy2
from secret import x
flag = b'?????????'
m = bytes_to_long(flag)
def obfuscate(p, k):
nbit = p.bit_length()
while True:
l1 = [getRandomRange(-1, 1) for _ in '_' * k]
l2 = [getRandomRange(100, nbit) for _ in '_' * k]
l3 = [getRandomRange(10, nbit//4) for _ in '_' * k]
l4 = [getRandomRange(2, 6) for _ in '_' *k]
A = sum([l1[_] * 2 ** ...
前言
这题当时国赛的时候由于没有怎么碰过MISC,到最后一步没做出来,实在是难受,今天复盘了一下
Analyze
拿到题目附件是一个流量包,可以看到分别有2.4.0,2.3.0,2.2.0,2.10.0,2.8.1,2.8.0这些地址的USB流量,我们可以一个一个筛选出来,然后通过导出特定分组进行保存,用UsbKeyboardDataHacker来提取其中的信息,最终会发现2.10.1和2.8.1中有有效信息
这里展示一下2.8.1的提取过程
# usb.src=="2.8.1"||usb.dst=="2.8.1"
31 0.010805 2.8.1 host USB 35 URB_INTERRUPT in
32 0.010818 host 2.8.1 USB 27 URB_INTERRUPT in
33 0.110764 2.8.1 host USB 35 URB_INTERRUPT in
34 0.110777 host 2.8.1 USB 27 URB_INTERRUPT in
35 0.166...
通过file指令可以看到程序编译的链接状态,在知道程序可以通过ROP来打的情况下,根据statically linked和dynamically linked两种链接方式来构造对应的ropchain和对应不同的攻击思路
dynamically linked
如果程序是动态链接的话,泄露程序函数的真实地址后拿到libc基址去得到例如system和/bin/sh的地址,这里不再赘述
statically linked
如果程序是静态链接,相对与动态链接就没有那么麻烦了,有的程序我们可以通过ROPgadget这个工具来帮助我们构造我们的ropchain
ROPgadget --binary 程序名 --ropchain
Example-inndyrop
m1nus@ubuntu:~/elf/buu/inndy_rop$ file inndy_rop
inndy_rop: ELF 32-bit LSB executable, Intel 80386, version 1 (GNU/Linux), statically linked, for GNU/Linux 2.6.32, Buil...
为什么需要stack pivoting
当stack overflow的空间不足时
怎么实现stack pivoting
通过将ebp覆盖成构造的fake_ebp,然后利用leave_ret这个gadget将esp劫持到fake_ebp的地址上,从而实现栈的迁移
为什么是leave ret
leave:
mov esp , ebp;
pop ebp;
ret:
pop eip
实现过程
首先程序有stack overflow漏洞,我们将栈覆盖成下面的样子
执行完mov esp , ebp后
接着就是pop ebp,执行完后如图
由于esp是栈顶指针,当pop ebp后,栈顶的元素被弹给了ebp,所以esp应当向下移4个字节,也就是一个单位
下一步通过read()函数的ret来把内容输入到fake_ebp1地址上,这里主要是要将fake_ebp2的地址给到fake_ebp1的地址上
下一步就来到了leave_ret,也就是重复上方的mov esp,ebp pop ebp和pop eip
mov esp,ebp 后
接着pop ebp,由于fake_...
Stack Smashing
当canary被覆盖后,会call到__stack_chk_fail打印argv[0]这个指针指向的字符串,默认是程序的名字,如果我们把它覆盖为其他的地址时,它就会把其他内存地址的信息给打印出来
Example:wdb2018_guess
Analyze
Arch: amd64-64-little
RELRO: Partial RELRO
Stack: Canary found
NX: NX enabled
PIE: No PIE (0x400000)
This is GUESS FLAG CHALLENGE!
Please type your guessing flag
123
You should take more effort to get six sence, and one more challenge!!
Please type your guessing flag
以上是程序开启的一些保护和大概的流程
main
__int64 __fastcall main(__int64 a1, char ...